home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 684 / emptyhandler / empty.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  3KB  |  133 lines

  1. /*
  2.     EMPTY.c
  3.     ------
  4.     Beispiel für einen DOS-Handler mit minimalem Funktionsumfang
  5.  
  6.     von Oliver Wagner, © Amiga-DOS
  7.  
  8. */
  9.  
  10.  
  11. #include <proto/exec.h>
  12. #include <proto/dos.h>
  13. #include <string.h>
  14. #include <libraries/filehandler.h>
  15.  
  16. /* Protos der Routinen aus misc.c */
  17.  
  18. extern void returnpacket(struct DosPacket*,struct Process*,long,long);
  19. extern struct DosPacket *getpacket(struct Process*);
  20.  
  21. int atoi(char*);
  22.  
  23. char ver_version[]={"$VER: empty-handler v1.0 (" __DATE__ ")"};
  24.  
  25. /* Der eigentliche Handler */
  26.  
  27. void __saveds empty_handler(void)
  28. {
  29.     struct Process *hproc;
  30.     struct DosPacket *packet;
  31.     struct DeviceNode *devnode;
  32.     struct FileHandle *fh;
  33.  
  34.     short running=TRUE;
  35.     long opencount=0;
  36.     int emptylen,readlen,c;
  37.     char *nump;
  38.     char filename[64];
  39.  
  40.     /* Handler initialisieren, Startup-Packet annehmen */
  41.  
  42.     hproc=(struct Process*)FindTask(0);
  43.     packet=getpacket(hproc);
  44.     devnode=(struct DeviceNode*)BADDR(packet->dp_Arg3);
  45.     devnode->dn_Task=&hproc->pr_MsgPort;
  46.  
  47.     /* und Startup-Packet zurückgeben. Damit läuft der Handler */
  48.  
  49.     returnpacket(packet,hproc,DOSTRUE,0);
  50.  
  51.     /* Hauptschleife des Handlers */
  52.  
  53.     while(running) {
  54.     packet = getpacket(hproc);
  55.     switch(packet->dp_Type) {
  56.  
  57.  
  58.         /* "File" öffnen */
  59.  
  60.         case ACTION_FINDUPDATE:
  61.         case ACTION_FINDINPUT:
  62.         case ACTION_FINDOUTPUT:
  63.         nump=(packet->dp_Arg3)<<2;
  64.                 for(c=0; c<(int)*nump; c++) filename[c]=nump[c+1];
  65.         filename[c]=0;
  66.         nump=filename;
  67.         while(*nump && *nump!=':') nump++;
  68.         if(*nump==':') nump++;
  69.         emptylen=atoi(nump);
  70.         opencount++;
  71.         /* FileHandle-Struktur */
  72.         fh=(struct FileHandle*)BADDR(packet->dp_Arg1);
  73.         /* Nicht-Interaktives File */
  74.         fh->fh_Port=0;
  75.         /* wird bei Read usw. übergeben */
  76.         fh->fh_Args=(long)fh;
  77.         /* Länge des Leerfiles */
  78.         fh->fh_Arg2=(long)emptylen;
  79.         /* Falls Ende der Liste, neu von vorne */
  80.         /* Packet zurückgeben */
  81.         returnpacket(packet,hproc,DOSTRUE,0);
  82.           break;
  83.  
  84.  
  85.         /* File schließen... */
  86.  
  87.         case ACTION_END:
  88.         /* Falls kein "Öffner", Handler beenden */
  89.         if(--opencount==0) running=0;
  90.         returnpacket(packet,hproc,DOSTRUE,0);
  91.           break;
  92.  
  93.  
  94.         /* lesen */
  95.  
  96.         case ACTION_READ:
  97.         /* FileHandle, bei Open eingetragen */
  98.         fh=(struct FileHandle*)packet->dp_Arg1;
  99.         nump=packet->dp_Arg2;
  100.         emptylen=fh->fh_Arg2;
  101.         readlen=packet->dp_Arg3;
  102.         /* Falls mehr Zeichen angefordert, als lieferbar,
  103.            entsprechend kürzen */
  104.         if(readlen>emptylen) readlen=emptylen;
  105.         for(c=0; c<readlen; c++) *nump++=0;
  106.         /* Länge subtrahieren */
  107.         fh->fh_Arg2-=readlen;
  108.         /* Packet zurückschicken */
  109.         returnpacket(packet,hproc,readlen,0);
  110.           break;
  111.  
  112.  
  113.         /* Schreiben leider nicht möglich */
  114.  
  115.         case ACTION_WRITE:
  116.         /* Schreibfehler */
  117.         returnpacket(packet,hproc,DOSFALSE,ERROR_DISK_WRITE_PROTECTED);
  118.           break;
  119.  
  120.  
  121.         /* Unbekanntes Packet */
  122.  
  123.         default:
  124.         returnpacket(packet,hproc,DOSFALSE,ERROR_ACTION_NOT_KNOWN);
  125.           break;
  126.     }
  127.     }
  128.  
  129.     /* DevNode löschen, Handler beendet */
  130.  
  131.     devnode->dn_Task=FALSE;
  132. }
  133.